<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

<script>
// 1.  问号运算符   ->  两个相关 ， 都是 和 「对象」  进行配合使用

// `?.`
  // 作用：获取 对象的 属性值；   ->   若 undefined?.xx  ->  返回值为 undefined
    // 反例：  undefined.xx  ->  会报错

// `??`    ->  作用：替代  `||`  进行 ”非空判断“/默认值
  // 作用： undefined ?? xx  ->  返回值是  xx
    // 反例： '' || xx  ->  返回值是 xx；      '' ?? xx  ->  返回值是 ''
    // 0 || xx ->  返回值是 xx；            0 ?? xx  ->  返回值是 0
  // 总结： || 运算符，前面的表达式为「假」，就返回后面的表达式
  //   `??` 运算符，前面的表达式 只有为 undefined 和 null， 才返回后面的表达式

// -------------------

/* 面试问题：  请说一说 什么叫 原型链？  - What
  1. 任何对象，都有一个 __proto__  的”私有属性“，其指向「原型对象」
  2. 任何对象，本质都是从 构造函数 生成的，所以 构造函数.prototype 也指向「原型对象」
    1 和 2 说的原型对象，是一个对象
  3. 在JS中，任何数据类型本质都是对象。 但 why?
    举例，以数组举例， arr.__proto__ 指向 Array.prototype ，但为 原型对象也是对象
      所以， Array.prototype.__proto__ 这个私有属性，其指向  Object.prototype ，它是 Object 的原型对象
       总结，数组是对象，它是这样；我们任意 自定义实例对象，它也是这样，那么 他们至少都有两个原型对象； 1）自己的构造函数的原型对象 2）自己的原型对象的原型对象（Object.prototype）
          所以，两个原型对象，形成了类似一个”链“，我们管它叫「原型链」。
*/
</script>